package com.beiwei.service;

import java.util.List;

import org.apache.shiro.crypto.hash.Md5Hash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.beiwei.auto.mode.Permission;
import com.beiwei.auto.mode.User;
import com.beiwei.auto.mode.UserExample;
import com.beiwei.mapper.VPermissionMapper;
import com.beiwei.mapper.VUserMapper;
import com.beiwei.util.PasswordUtil;

@Service
public class UserService {

	@Autowired
	private VUserMapper vUserMapper;

	@Autowired
	private VPermissionMapper vPermissionMapper;

	/**
	 * 根据用户id查询用户
	 */
	public User findUserByUserId(Integer userId) throws Exception {
		return vUserMapper.selectByPrimaryKey(userId);
	}

	/**
	 * 根据用户的usercode查找用户
	 */
	public User findUserByUsercode(String usercode) throws Exception {
		UserExample userExample = new UserExample();
		UserExample.Criteria criteria = userExample.createCriteria();
		criteria.andUsercodeEqualTo(usercode).andDelFlagEqualTo(0);

		List<User> users = vUserMapper.selectByExample(userExample);
		if (users != null && users.size() == 1) {
			return users.get(0);
		}
		return null;
	}

	/**
	 * 根据用户id批量删除用户
	 */
	public boolean deleteUserByUserids(List<Integer> ids) throws Exception {
		UserExample userExample = new UserExample();
		UserExample.Criteria criteria = userExample.createCriteria();
		criteria.andUserIdIn(ids);
		User user = new User();
		user.setDelFlag(1);
		if (vUserMapper.updateByExampleSelective(user, userExample) > 0) {
			return true;
		}
		return false;
	}

	/**
	 * 查询该公司下所有用户
	 */
	public List<User> findAllUser(Integer companyId) throws Exception {
		UserExample userExample = new UserExample();
		UserExample.Criteria criteria = userExample.createCriteria();
		criteria.andUserCompanyIdEqualTo(companyId);
		criteria.andDelFlagEqualTo(0);
		List<User> users = vUserMapper.selectByExample(userExample);

		return users;
	}

	/**
	 * 获取所有的有效用户（定时任务使用）
	 */
	public List<User> findAllUsers() throws Exception {
		UserExample userExample = new UserExample();
		UserExample.Criteria criteria = userExample.createCriteria();
		criteria.andDelFlagEqualTo(0);
		List<User> users = vUserMapper.selectByExample(userExample);

		return users;
	}

	/**
	 * 根据用户的id查询该用户所拥有的的菜单列表信息
	 */
	public List<Permission> findMenuListByUserRoleIds(String userRoleIds) throws Exception {
		return vPermissionMapper.findMenuListByUserRoleIds(userRoleIds);
	}

	/**
	 * 根据用户的id查询改用的所有权限
	 */
	public List<Permission> findPermissionListByUserRoleIds(String userRoleIds) throws Exception {
		return vPermissionMapper.findPermissionListByUserRoleIds(userRoleIds);
	}

	/**
	 * 新增用户
	 */
	public boolean addUser(User user) throws Exception {

		// 原始 密码
		String password = "111111";
		// 盐
		String salt = PasswordUtil.getRandomString(6);
		// 散列次数
		int hashIterations = 1;
		// 构造方法中：
		// 第一个参数：明文，原始密码
		// 第二个参数：盐，通过使用随机数
		// 第三个参数：散列的次数，比如散列两次，相当 于md5(md5(''))
		Md5Hash md5Hash = new Md5Hash(password, salt, hashIterations);
		user.setSalt(salt);
		user.setPassword(md5Hash.toString());

		if (1 == vUserMapper.insertSelective(user)) {
			return true;
		}
		return false;
	}

	/**
	 * 返回密码md5密文
	 */
	public String getMd5HashPwd(String pwd, String salt) {
		Md5Hash md5Hash = new Md5Hash(pwd, salt, 1);
		return md5Hash.toString();
	}

	/**
	 * 修改用户密码
	 */
	public boolean updateUserPwd(User user) {
		// 盐
		String salt = PasswordUtil.getRandomString(6);
		Md5Hash md5Hash = new Md5Hash(user.getPassword(), salt, 1);

		user.setSalt(salt);
		user.setPassword(md5Hash.toString());

		if (1 == vUserMapper.updateByPrimaryKeySelective(user)) {
			return true;
		}
		return false;
	}

	/**
	 * 修改保存用户
	 */
	public boolean saveUser(User user) throws Exception {
		if (user.getPassword().equals("0")) {// 表示不修改密码
			user.setPassword(null);
		} else {
			// 原始 密码
			String password = "111111";
			// 盐
			String salt = PasswordUtil.getRandomString(6);
			// 散列次数
			int hashIterations = 1;
			// 构造方法中：
			// 第一个参数：明文，原始密码
			// 第二个参数：盐，通过使用随机数
			// 第三个参数：散列的次数，比如散列两次，相当 于md5(md5(''))
			Md5Hash md5Hash = new Md5Hash(password, salt, hashIterations);
			user.setSalt(salt);
			user.setPassword(md5Hash.toString());
		}
		if (1 == vUserMapper.updateByPrimaryKeySelective(user)) {
			return true;
		}

		return false;
	}

}
